<?php 

/**
 * Diese Klasse verwaltet alle Objekte vom Typ Right
 * 
 * @author mills
 *
 */
class RightDAO extends AbstractDAO {
	
	/**
	 * Der Konstruktor stattet die DAO mit einem DB Objekt aus
	 */
	function __construct() {
		parent::__construct('Right');
		
		{	// Wenn es die Tabelle nicht gibt, dann soll diese erzeugt werden
			$sql = 'CREATE TABLE IF NOT EXISTS '.Right::$tablename.' (
						ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
						Name VARCHAR(30) NOT NULL,
						Description VARCHAR(255) NOT NULL
   					)';

			$db = DBFactory::getInstance();
			
			// Query vorbereiten
			if (!$stmt = $db->prepare($sql)) {
				// error
				$this->logger->logFile('Database error creating table '.Right::$tablename.': '. $db->error, LEVEL_ERROR);
				
				return null;
			}

			// Statement ausführen
			if (!$stmt->execute()) {
				// error
				$this->logger->logFile('Statement error creating table '.Right::$tablename.': '. $stmt->error, LEVEL_ERROR);
				
				return null;
			}

			// Statement beenden
			$stmt->close();
			
			unset($db);
		}
	}
	
	/**
	 * Der Destruktor entfernt die Referen auf das DB Objekt
	 */
	function __destruct() {
		parent::__destruct();
	}
	
	/**
	 * Diese Methode liest die Entität von Right mit dem namen aus der Datenbank
	 * 
	 * @param strin $name name der Entität
	 * @return Right wenn vorhanden, sonst null
	 */
	public function getByName($name) {
		// Wenn vorher ein Fehler aufgetreten ist, schlucken
		$this->handle_previous_error();
		
		// debug
		$this->logger->logFile("Loading Right with name '". $name ."' from database...\n", LEVEL_DEBUG);
		
		// Lade das Recht mit dem Namen aus der DB
		$entity = $this->em->getRepository('Right')->findBy(array('Name' => $name));
		
		// debug
		$this->logger->logFile($entity ? "Loading Right entity with name '". $name ."' was successfull." : "No Right entity found with name '". $name ."'.", LEVEL_DEBUG);
		
		// Es sollte wenn, dann nur ein Recht mit dem gefragten Namen geben
		return $entity ? $entity[0] : null;
	}
	
	/**
	 * Diese Methode updated die Right Entität
	 * 
	 * @param Right $right die Right Entität
	 * @return RightID wenn erfolgreich, sonst null und Fehler in error
	 */
	public function update($right) {
		// Wenn vorher ein Fehler aufgetreten ist, schlucken
		$this->handle_previous_error();
		
		// debug
		$this->logger->logFile("Updating Right '". $right->get_name() ."'...", LEVEL_DEBUG);

		// TODO
		
		// debug
		$this->logger->logFile("Right '". $right->get_name() ."' successfully updated.", LEVEL_DEBUG);
		
		// An dieser Stelle ist alles super, deswegen id zurückgeben
		$ret = $right->get_id();
		
		return $ret;
	}
	
	public function exists($right) {
		// Für die Existenz eines Rechtes muss nur der Name geprüft werden, da dieser Unique sein muss
		
		// Wenn vorher ein Fehler aufgetreten ist, schlucken
		$this->handle_previous_error();
		
		// debug
		$this->logger->logFile("Checking on Right '". $right->get_name() ."'", LEVEL_DEBUG);
		
		// Lade alle Entitäten mit dem name aus der DB
		$entity = $this->em->getRepository('Right')->findBy(array('Name' => $right->get_name()));
		
		// debug
		$this->logger->logFile($entity ? "Right entity does exsist." : "Right entity does not exsist.", LEVEL_DEBUG);
		
		return $entity ? $entity[0] : false;
	}
	
	public function pre_delete($entity) {
		{ // Lösche alle Userrights, die mit diesem Recht belegt sind
			$userrights = DAOFactory::getInstance('Userright')->getByRightId($entity->get_id());
			foreach ($userrights as $userright) {
				DAOFactory::getInstance('Userright')->delete($userright);
			}
		}
		
		{ // Lösche alle Accessrights, die mit diesem Recht belegt sind
			$accessrights = DAOFactory::getInstance('Accessright')->getByRightId($entity->get_id());
			foreach ($accessrights as $accessright) {
				DAOFactory::getInstance('Accessright')->delete($accessright);
			}
		}
	}
}
?>